import os
from dotenv import load_dotenv
from dataclasses import dataclass, field
from typing import Optional

# 加载环境变量
load_dotenv()

@dataclass(frozen=True)
class Config:
    """应用程序配置类"""
    # OpenAI API配置
    api_key: str = field(default_factory=lambda: os.getenv('OPENAI_API_KEY', ''))
    api_base: str = field(default_factory=lambda: os.getenv('OPENAI_API_BASE', 'https://api.openai.com/v1'))
    model: str = field(default_factory=lambda: os.getenv('OPENAI_MODEL', ''))
    
    # 应用程序配置
    app_title: str = field(default_factory=lambda: os.getenv('APP_TITLE', 'ChatGPT桌面客户端'))
    window_width: int = field(default_factory=lambda: int(os.getenv('WINDOW_WIDTH', '800')))
    window_height: int = field(default_factory=lambda: int(os.getenv('WINDOW_HEIGHT', '600')))
    
    # 对话历史配置
    history_dir: str = field(default_factory=lambda: os.getenv('HISTORY_DIR', 'history'))
    history_file: str = field(default_factory=lambda: os.getenv('HISTORY_FILE', 'chat_history.json'))
    max_history: int = field(default_factory=lambda: int(os.getenv('MAX_HISTORY', '100')))
    use_history: bool = field(default_factory=lambda: os.getenv('USE_HISTORY', 'true').lower() == 'true')
    max_context: int = field(default_factory=lambda: int(os.getenv('MAX_CONTEXT', '10')))
    
    # 系统提示配置
    system_prompt: str = field(default_factory=lambda: os.getenv('SYSTEM_PROMPT', '你是一个有帮助的AI助手。'))
    
    @property
    def is_valid(self) -> bool:
        """检查配置是否有效"""
        return bool(self.api_key)
    
    def get_error_message(self) -> Optional[str]:
        """获取配置错误信息"""
        if not self.api_key:
            return "未设置 OpenAI API 密钥。请在 .env 文件中设置 OPENAI_API_KEY。"
        return None

def reload_config() -> Config:
    """重新加载配置
    
    重新加载环境变量并创建新的配置对象
    返回新的Config实例
    """
    # 重新加载环境变量
    load_dotenv()
    
    # 创建新的配置实例
    new_config = Config()
    
    # 检查配置是否有效
    error_msg = new_config.get_error_message()
    from dataclasses import asdict
    print("当前配置:", asdict(new_config))
    if error_msg:
        raise ValueError(error_msg)
    
    return new_config

# 创建全局配置实例
config = Config()